package org.apache.ibatis.common.reflection.property;

import org.apache.ibatis.common.reflection.ReflectorException;

import java.security.interfaces.ECKey;
import java.util.Locale;

/**
 * @Name PropertyNamer
 * @Description: 属性名称（包括属性方法）处理器
 * 描述信息：该类主要提供属性名称（包括属性方法）相关的操作。
 * 例如，通过 getter、setter 的方法名称找出对应的属性等。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-04-25 15:44:22
 **/
public class PropertyNamer {
    private PropertyNamer() {
    }

    /**
     * 将 setter、getter 属性方法名称转化为属性名称
     *
     * @param name setter、getter 方法名称
     * @return java.lang.String 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 15:47:13
     */
    public static String methodToProperty(String name) {
        if (name.startsWith("is")) name = name.substring(2);
        else if (name.startsWith("get") || name.startsWith("set")) name = name.substring(3);
        else
            throw new ReflectorException("无法解析属性方法 [" + name + "]，它不符合 JavaBean 的命名规范，即不是以 'is'、'get'、'set' 开头的属性方法！");
        // 如果属性方法首字母为大写，统一将其转为小写。
        if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) {
            name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
        }
        return name;
    }

    /**
     * 判断方法名称是否为 setter、getter 属性方法
     *
     * @param name 方法名称
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 15:48:16
     */
    public static boolean isProperty(String name) {
        return isSetter(name) || isGetter(name);
    }

    /**
     * 判断方法名称是否为 setter 属性方法
     *
     * @param name 方法名称
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 15:48:16
     */
    public static boolean isSetter(String name) {
        return name.startsWith("set") && name.length() > 3;
    }

    /**
     * 判断方法名称是否为 getter 属性方法
     *
     * @param name 方法名称
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 15:48:16
     */
    public static boolean isGetter(String name) {
        return (name.startsWith("get") && name.length() > 3) || (name.startsWith("is") && name.length() > 2);
    }

}

